docker save load 与 docker export import

  • 利用ssh pv Linux管道 实现镜像迁移(带进度条)
docker save <镜像名> | bzip2 | pv | ssh <用户名>@<主机名> 'cat |docker load'
  • docker load 与 docker import区别
容器快照文件将丢失所有的历史数据和元数据信息(仅保存容器当时的快照状态)
从容器快照文件导入时可以重新指定标签等元数据信息。
镜像存储文件则将保存完整记录, 体积也要更大。

清除所有处于终止状态的容器

docker container prune

访问仓库

  • 仓库(Repository)是集中存放镜像的地方。
  • 一个容易混淆的概念是注册服务器(Registry)。
  • Registry是管理仓库的具体服务器,每个Registry可以有多个Repository,每个Repository下面多个image。
  • 仓库可以看成是一个具体的项目或目录。
  • d1.dockerpool.com/ubuntu, d1.dockerpool.com是注册服务器地址,ubuntu是仓库名。

Docker Hub

  • 需要先注册一个Docker账号
  • 命令行登陆 退出

    docker login
    docker logout
  • 查找 拉取镜像

    docker search
    docker pull
  • 推送镜像

    用户在登陆后 docker push 将自己的镜像推送到Docker Hub
  • 自动创建

    • 创建并登陆Docker Hub 以及目标网站
    • 在目标网站中连接账户到Docker Hub
    • 在Docker Hub中配置一个自动创建
    • 选取一个目标网站中的项目(需要包含Dockerfile)和分支
    • 指定Dockerfile位置, 并提交创建

私有仓库

  • 容器运行

    docker run -d -p 5000:5000 -v /opt/data/registry:/var/lib/registry registry
  • 在私有仓库上传、搜索、下载镜像

    • docker tag 标记一个镜像,并推送到仓库。比如私有仓库地址为127.0.0.1:5000

      格式: docker tag IMAGE[:TAG] [REGISTRY_HOST][:REGISTRY_PORT/]REPOSITORY[:TAG]
      docker tag docker.io/mysql:5 127.0.0.1:5000/docker.io/mysql:5
    • docker push 上传标记的镜像

      docker push 127.0.0.1:5000/docker.io/mysql
    • curl 查看仓库中的镜像

      curl 127.0.0.1:5000/v2/_catalog
    • 从私有仓库下载

      需要先删除已有镜像
      docker  image rm 127.0.0.1:5000/docker.io/mysql:5
      docker pull 127.0.0.1:5000/docker.io/mysql:5
    • 注意事项

      Docker默认不允许非HTTPS方式推送镜像,可以通过docker配置选项取消这个限制
      • 对于upstar系统(Ubuntu 14.04 Debian7 Wheezy)

        编辑/etc/default/docker,在其中的DOCKER_OPTS增加内容
        DOCKER_OPTS="--registry-mirror=https://registry.docker-cn.com --insecure-registries=10.9.2.100:5000"
        
        sudo service docker restart
      • 对于systemd系统(Ubuntu16.04+ Debian8+ centos7)

        编辑/etc/docker/daemon.json (不存在则新建)
        
        {
            "registry-mirror": [
            "https://registry.docker-cn.com"
            ],
            "insecure-registries": [
            "122.112.207.157:5000"
            ]
        }
        
        systemctl restart docker

私有仓库高级配置

使用Docker Compose构建,搭建一个拥有权限认证、TLS的私有仓库
  • 使用openssl自行签发docker.domain.com的站点的SSL证书

    • step1 创建 CA 密钥

      openssl genrsa -out "root-ca.key" 4096
    • step2 利用私钥创建 CA 根证书请求文件

      openssl req \
      -new -key "root-ca.key" \
      -out "root-ca.csr" -sha256 \
      -subj '/C=CN/ST=Zhejiang/L=Hangzhou/O=eichong/CN=eichong Docker Registry CA'
      -subj参数
      /C 表示国家 如CN
      /ST 表示省
      /L 表示城市或地区
      /O 表示组织名
      /CN 通用名称
    • step3 配置 CA 根证书,新建root-ca.cnf

      [root_ca]
      basicConstraints = critical, CA:TRUE, pathlen:1
      keyUsage = critical, nonRepudiation, cRLSign, keyCertSign
      subjectKeyIdentifier=hash
    • step4 签发根证书

      openssl x509 -req -days 3650 -in "root-ca.csr" \
      -signkey "root-ca.key" -sha256 -out "root-ca.crt" \
      -extfile "root-ca.cnf" -extensions \
      root_ca
    • step5 生成站点 SSL 私钥

      openssl genrsa -out "docker.domain.com.key" 4096
    • step6 使用私钥生成证书请求文件

      openssl req -new -key "docker.domain.com.key" -out "site.csr" -sha256 \
      -subj '/C=CN/ST=Zhejiang/L=Hangzhou/O=eichong/CN=docker.domain.com'
    • step7 配置证书,新建 site.cnf 文件

      [server]
      authorityKeyIdentifier=keyid, issuer
      basicConstraints = critical, CA:FALSE
      extendedKeyUsage=serverAuth
      keyUsage = critical, digitalSignature, keyEncipherment
      subjectAltName = DNS:docker.domain.com, IP:127.0.0.1
      subjectKeyIdentifier=hash
    • step8 签署站点 SSL 证书

      openssl x509 -req -days 750 -in "site.csr" -sha256 \
      -CA "root-ca.crt" -CAkey "root-ca.key" -CAcreateserial \
      -out "docker.domain.com.crt" -extfile "site.cnf" -extensions server
      经过以上步骤,就拥有了docker.domain.com的网站SSL私钥 docker.domain.com.key 和 SSL证书 docker.domain.com.crt
      新建ssl文件夹将 docker.domain.com.key docker.domain.com.crt 移入,其他删除
  • 配置私有仓库

     私有仓库默认的配置文件位于 /etc/docker/registry/config.yml ,我们先在本地编辑
     config.yml ,之后挂载到容器中。
version: 0.1
log:
    accesslog:
        disabled: true
    level: debug
    formatter: text
    fields:
        service: registry
        environment: staging
storage:
    delete:
        enabled: true
    cache:
        blobdescriptor: inmemory
    filesystem:
        rootdirectory: /var/lib/registry
auth:
    htpasswd:
        realm: basic-realm
        path: /etc/docker/registry/auth/nginx.htpasswd
http:
    addr: :443
    host: https://docker.domain.com
    headers:
        X-Content-Type-Options: [nosniff]
    http2:
        disabled: false
    tls:
        certificate: /etc/docker/registry/ssl/docker.domain.com.crt
        key: /etc/docker/registry/ssl/docker.domain.com.key
health:
    storagedriver:
        enabled: true
        interval: 10s
threshold: 3
  • 生成 http 认证文件

     mkdir auth
    
     docker run --rm \
     --entrypoint htpasswd registry \
     -Bbn username password > auth/nginx.htpasswd
  • 编辑 docker-compose.yml
version: '3'

services:
    registry:
        image: registry
        ports:
            - "443:443"
        volumes:
            - ./:/etc/docker/registry
            - registry-data:/var/lib/registry
volumes:
    registry-data:
  • 修改 hosts

    • 编辑 /etc/hosts

      docker.domain.com 127.0.0.1
    • 启动

      docker-compose up -d
  • 测试私有仓库功能

    • 登录到私有仓库

      docker login docker.domain.com
    • 尝试推送、拉取镜像

      docker pull ubuntu:17.10
      docker tag ubuntu:17.10 docker.domain.com/username/ubuntu:17.10
      docker push docker.domain.com/username/ubuntu:17.10
      docker image rm docker.domain.com/username/ubuntu:17.10
      docker pull docker.domain.com/username/ubuntu:17.10
    • 443端口若被占用,请尝试用Nginx代理

EngineerLeo
598 声望38 粉丝

专注于云原生、AI等相关技术